package com.lancoo.ccas52.arrangecourse.rulecheck;

import com.lancoo.ccas52.arrangecourse.entities.BaseRule;

/**
 * @Description 初始化不同的规则检测方式
 * @Author Fortysun
 * @Date 2023/9/12 15:29
 **/
public class RuleInit {
    //声明无冲突排课，需要满足的规则，包括基础规则
    RuleService noClashBaseRule;
    //声明无冲突排课规则，不包括基础规则
    RuleService noClashRule;
    //声明冲突排课的规则
    RuleService clashRule;
    //声明优先排排课的规则
    RuleService fixCourseRule;

    //声明跨校区排课的规则
    RuleService crossCampusRule;

    public RuleInit(BaseRule baseRule) {

        if (noClashBaseRule == null) {
            //初始化无冲突排课模式下的排课规则,包括基础规则、跨校区规则和冲突检测
            noClashBaseRule = initNoClashBaseRule(baseRule);
        }

        if (noClashRule == null) {
            //初始化无冲突排课模式下的排课规则,包括跨校区规则和冲突检测
            noClashRule = initNoClashRule(baseRule);
        }

        if (clashRule == null) {
            //初始化冲突排课模式下的排课规则,包括跨校区规则和冲突排课规则检测
            clashRule = initClashRule(baseRule);
        }

        if (fixCourseRule == null) {
            //初始化优先排排课规则
            fixCourseRule = initFixCourseRule(baseRule);
        }

        if (crossCampusRule == null) {
            //初始化跨校区排课排课规则
            crossCampusRule = initCrossCampusRule(baseRule);
        }
    }

    /**
     * 获取无冲突排课模式下的排课规则,包括基础规则、跨校区规则和冲突检测
     * @return
     */
    public RuleService getNoClashBaseRule() {
        return this.noClashBaseRule;
    }

    /**
     * 获取无冲突排课模式下的排课规则,包括跨校区规则和冲突检测
     * @return
     */
    public RuleService getNoClashRule() {
        return this.noClashRule;
    }

    /**
     * 获取冲突排课模式下的排课规则,包括跨校区规则和冲突排课规则检测
     * @return
     */
    public RuleService getClashRule() {
        return this.clashRule;
    }

    /**
     * 获取优先排排课规则
     * @return
     */
    public RuleService getFixCourseRule() {
        return this.fixCourseRule;
    }

    /**
     * 获取跨校区排课规则
     * @return
     */
    public RuleService getCrossCampusRule() {
        return this.crossCampusRule;
    }

    /**
     * 初始化无冲突排课模式下的排课规则,包括基础规则、跨校区规则和冲突检测
     * @param baseRule 基础排课规则
     * @return
     */
    private RuleService initNoClashBaseRule(BaseRule baseRule) {
        //使用装饰器模式，对排课的规则进行自由组合，被装饰的对象是ScheduleRule
        //定义基础排规则检测的对象,首先检基础规则
        RuleService ruleService = new BaseRuleCheck(new ScheduleRule(), baseRule);
        //添加基础的无冲突排课规则的检测；
        ruleService = new NoClashRuleCheck(ruleService, baseRule);
        //返回装饰完的最终的对象；
        return ruleService;
    }

    /**
     * 初始化无冲突排课模式下的排课规则,包括跨校区规则和冲突检测
     * @param baseRule 基础排课规则
     * @return
     */
    private RuleService initNoClashRule(BaseRule baseRule) {
        //使用装饰器模式，对排课的规则进行自由组合，被装饰的对象是ScheduleRule
        //添加基础的无冲突排课规则的检测；
        RuleService ruleService = new NoClashRuleCheck(new ScheduleRule(), baseRule);
        //返回装饰完的最终的对象；
        return ruleService;
    }

    /**
     * 初始化冲突排课模式下的排课规则,包括跨校区规则和冲突排课规则检测
     * @param baseRule 基础排课规则
     * @return
     */
    private RuleService initClashRule(BaseRule baseRule) {
        //使用装饰器模式，对排课的规则进行自由组合，被装饰的对象是ScheduleRule
        //添加基础的冲突排课规则的检测；
        RuleService ruleService = new ClashRuleCheck(new ScheduleRule(), baseRule);
        //返回装饰完的最终的对象；
        return ruleService;
    }

    /**
     * 初始化优先排排课规则
     * @param baseRule 基础排课规则
     * @return
     */
    private RuleService initFixCourseRule(BaseRule baseRule) {
        //使用装饰器模式，对排课的规则进行自由组合，被装饰的对象是ScheduleRule
        //定义优先排规则检测的对象,首先检测优先排规则
        RuleService ruleService = new FixCourseRuleCheck(new ScheduleRule(), baseRule);
        //添加基础规则的过滤检测
        ruleService = new BaseRuleCheck(ruleService, baseRule);
        //添加基础的无冲突排课规则的检测；
        ruleService = new NoClashRuleCheck(ruleService, baseRule);
        //返回装饰完的最终的对象；
        return ruleService;
    }

    /**
     * 初始化无冲突排课模式下的跨校区排课规则,包括跨校区规则和冲突检测
     * @param baseRule 基础排课规则
     * @return
     */
    private RuleService initCrossCampusRule(BaseRule baseRule) {
        //使用装饰器模式，对排课的规则进行自由组合，被装饰的对象是ScheduleRule
        //添加跨校区规则的过滤检测；
        RuleService ruleService = new CrossCampusRuleCheck(new ScheduleRule(), baseRule);
        //添加基础的无冲突排课规则的检测；
        ruleService = new NoClashRuleCheck(ruleService, baseRule);
        //返回装饰完的最终的对象；
        return ruleService;
    }
}
